10 - Kamera głębi

Wprowadzenie do przetwarzania obrazów

Politechnika Poznańska, Instytut Robotyki i Inteligencji Maszynowej

Ćwiczenie laboratoryjne 10: kamera głębi (RGB-D)

Powrót do spisu treści ćwiczeń laboratoryjnych

Wstęp

Kamery głębi (RGB-D) pozwalają uzyskać informację o rzeczywistej odległości obiektów od sensora oraz połączyć tę informację z obrazem RGB wskazując odpowiadające piksele. Kamery te znajdują zastosowanie głównie w warunkach wewnątrz pomieszczeń: w robotyce (film) oraz w rozszerzonej rzeczywistości (film).

Obraz RGB-D można uzyskać na 3 główne sposoby: - wykorzystać kamerę stereowizyjną, w których odległość jest zwykle szacowana na podstawie przesunięcia obiektu między dwoma, skaliborwanymi kamerami; - wykorzystać światło strukturalne - generalnie używa się sensora podczerwieni, który projektuje znany wzór oraz czujnik w kamerze; - wykorzystać sensor Time Of Flight (ToF) znany również jako LIDAR - wysyła on impuls światła o znanej długości fali oraz mierzy czas potrzebny na uzyskanie odpowiedzi.

Podczas zajęć wykorzystamy kamerę Intel® RealSense™ D435, która wyposażona jest w kamerę RGB, sensor IR oraz kamerę stereowizyjną o bazie 5 cm, co pozwala na dokładny pomiar głebi między 0.3 m i 3.0 m oraz maksymalny (deklarowany przez producenta) zasięg 10 metrów.

Dane

Pobierz paczkę ze skryptami do zadań.

Zadanie wstępne

Uruchom skrypt scripts/10/01_opencv_pointcloud_viewer.py by zwizualizować chmurę punktów z kamery. Sprawdź jak zmienia się chmura punktów korzystając z klawiszy: d, z, c. Spróbuj opisać słownie co ulega zmianie.

Zadania do samodzielnej realizacji

UWAGA Spróbuj zastąpić klasyczne zagłębianie for w for i interowanie po każdym pikselu poprzez operacje macierzowe. Każdy obraz w pythonie jest macierzą Numpy.

  1. Korzystając ze szkieletu programu scripts/10/02_background.py przygotuj program, który na podstawie obrazu głębi wyodrębni Twoją posturę z tła i umieści ją na własnym obrazie. Przykładowy efekt działania programu przedstawiono na filmie.
    Zadania szczegółowe:
    • wczytaj własny obraz korzystając z biblioteki OpenCV oraz wyrównaj jego rozmiar do wielkości obrazu z kamery głębi (funkcja read_background_image);
    • uzupełnij kod w funkcji depth_filter aby redukował odstające wartości w obrazie głębi.
      Sugerowane kroki:
      • Pozbądź się niedokładnych pomiarów tła. Zasięg sensora wg dokumentacji wynosi maksymalnie 10 m, jednak dokładność pomiarów znacznie spada powyżej 3 m. W tym celu zastąp wartości głębi większe niż wybrany próg tła (np. >2000) wartością tego progu (np. 2000).
      • Pozbądź się brakujących pomiarów tła. Gdy sensor nie odczytał pomiaru w danym regionie lub ten pomiar jest niedokładny, przypisuje on takiemu pomiarowi wartość 0. W tym celu zastąp wartości głębi równe zero przyjętą wartością tła (np. 2000),
      • Wygładź pomiary. Pomiary głębi mogą wykazywać pewne delikatne różnice ze względu na dokładność sensora i wprowadzać szum. W tym celu wykorzystaj filtr medianowy by pozbyć się go.
    • napisz funkcję add_background, która na podstawie obrazu głębi wklei posturę człowieka w wybrane tło.
      Tip 1. Utwórz kopię obrazu tła, by nie nadpisać oryginalnego obrazu.
      Tip 2. Utwórz maskę binarną korzystając z obrazu głębi i odpowiednio ją wykorzystaj na obrazie tła/obrazie RGB z kamery.
  2. Korzystając ze szkieletu programu scripts/10/03_paint.py oraz funkcji depth_filter z poprzedniego zadania przygotuj program, który będzie śledzić najbliższy punkt na obrazie oraz będzie ,,rysował’’ punkty gdy wciśnięta będzie spacja. Przykładowy efekt działania programu przedstawiono na filmie.
    Zadania szczegółowe:
    • przenieś funkcję depth_filter z poprzedniego zadania;
    • korzystając z funkcji cv2.minMaxLoc znajdź współrzędne oraz wartość najbliższego punktu punktu;
    • nanieś wskaźnik + (pionowa oraz pozioma linia) na obraz w miejscu najbliższego punktu;
    • w pobliżu wskaźnika + nanieś w formie tekstu wartość głębi w tym punkcie;
    • napisz kod, który pozwoli rysować czerowne koła o promieniu 5 gdy wciśnięta była spacja (lub spacja może przełączać tryb rysowania).
      Tip. Możesz utworzyć poza pętlą pustą maskę wypełnioną zerami (np.zeros), na której rysujesz koła o wartości 255. Następnie wykorzystaj ją do naniesienia koloru na obraz RGB z kamery.

Zadania dodatkowe

  1. Napisz program, który uruchomi alarm (np. komunikat na obrazie), gdy w wybranym obszarze obiekty znajdują się za blisko (lub/i za daleko) kamery.

  2. Napisz program, który będzie szukał 2 najbliższych kamerze punktów (np. dwóch palców) i uruchomi alarm gdy zbliżą się za bardzo do siebie.